source("loadAndProcessData.R")

#Calcul des corelation des variables par rapport a notre variable a explique : prix
correlations = data.frame(matrix(data = NA, nrow = 1, ncol = ncol(dataDiscretise)))
correlations = NULL
for(i in 1:ncol(dataDiscretise)){
	correlations = c(correlations, cor(dataDiscretise[,i], dataDiscretise$price, method = "pearson"))
}
names(correlations) = names(dataDiscretise)
print("correlation pearson")
print(sort(correlations))

correlationsSpearman = NULL
for(i in 1:ncol(dataDiscretise)){
	correlationsSpearman = c(correlationsSpearman, cor(dataDiscretise[,i], dataDiscretise$price, method = "spearman"))
}
names(correlationsSpearman) = names(dataDiscretise)
print("correlation spearman")
print(sort(correlationsSpearman)) # Comprendre pourquoi on a les memes correlations

# Regression
#regressionFullVar <- lm(dataDiscretise$price ~ dataDiscretise[,1] + dataDiscretise[,2] + dataDiscretise[,3] + dataDiscretise[,4] + dataDiscretise[,5] + dataDiscretise[,6] + dataDiscretise[,7] + dataDiscretise[,8] + dataDiscretise[,9] + dataDiscretise[,10] + dataDiscretise[,15] + dataDiscretise[,12] + dataDiscretise[,13] + dataDiscretise[,14] + dataDiscretise[,15] + dataDiscretise[,16] + dataDiscretise[,17] + dataDiscretise[,18] + dataDiscretise[,19] + dataDiscretise[,20] + dataDiscretise[,21] + dataDiscretise[,22] + dataDiscretise[,23] + dataDiscretise[,24] + dataDiscretise[,25])
#print(summary(regressionFullVar))
regressionFullVar <- lm(dataDiscretise$price ~ ., data = dataDiscretise[,1:ncol(dataDiscretise)-1])
print("regression full variables")
print(summary(regressionFullVar))

regressionQuantitative <- lm(dataQuantitative$price ~ ., data = dataQuantitative[,1:ncol(dataQuantitative)-1])
print("regression sans indicatrices")
print(summary(regressionQuantitative))

regressionIndicatrice <- lm(dataIndicatrice$price ~ ., data = dataIndicatrice[,1:ncol(dataIndicatrice)-1])
print("regression avec seulement indicatrices")
print(summary(regressionIndicatrice))


modelFunctionFull <-function(price, data){
	return(lm(price ~ ., data = data))
}

validationCroisee <- function(data, modelFunction, nbIterations = 10, percentModel = 0.7){
	nombreDeLigne <- nrow(data)
	nombreDeLigneModel <- round(nrow(data)*percentModel)
	nombreDeLigneTest <- nombreDeLigne - nombreDeLigneModel
	ecartsMoyenModel <- NULL
	ecartsMoyenTest <- NULL
	for(i in 1:nbIterations){
		indiceDataModel <- sample(1:nombreDeLigne, size = nombreDeLigneModel, replace = FALSE)
		priceModel = data[indiceDataModel, ncol(data)]
		dataModel = data[indiceDataModel, 1:ncol(data)-1]
		priceTest = data[-indiceDataModel, ncol(data)]
		dataTest = data[-indiceDataModel, 1:ncol(data)-1]
		model <- modelFunction(priceModel, dataModel)
		#prediction = predict.lm(model, newdata=dataTest, se.fit = TRUE)
		prediction = predict.lm(model, newdata=dataTest)
		#print("============")
		#print(priceTest)
		#print(prediction)
		#print("----")
		ecartMoyenModel <- sqrt(sum((prediction - priceTest)**2))/nombreDeLigneTest
		ecartMoyenTest <- sqrt(sum((predict.lm(model) - priceModel)**2))/nombreDeLigneTest
		ecartsMoyenModel <- c(ecartsMoyenModel, ecartMoyenModel)
		ecartsMoyenTest <- c(ecartsMoyenTest, ecartMoyenTest)
	}
	print(paste("Moyenne des ecarts du model : ", mean(ecartsMoyenModel)))
	print(paste("Moyenne des ecarts de l'echantillon test : ", mean(ecartsMoyenTest)))
}

#validationCroisee(dataDiscretise[, 70:75], modelFunctionFull) #Pour eviter le message d'avis il faut donner moins de variables
#print("Model avec indicatrices")
#validationCroisee(dataDiscretise, modelFunctionFull)

#Regresion sur les donnees quantitatives
#print("Model sans indicatrices")
#validationCroisee(dataQuantitative, modelFunctionFull)

#Regresion en utilisant que les indicatrices
#print("Model avec seulement indicatrices")
#validationCroisee(dataIndicatrice, modelFunctionFull)

validationCroisee2 <- function(data, modelFunction){
	#En fait il faut utiliser quanque donner une par une.
	nombreDeLigne <- nrow(data)
	nombreDeLigneModel <- 1
	nombreDeLigneTest <- nombreDeLigne - nombreDeLigneModel
	nbIterations <- nombreDeLigne
	ecartsMoyenModel <- NULL
	ecartsMoyenTest <- NULL
	allIndices <- 1:nrow(data)
	for(i in 1:nbIterations){
		indiceDataModel <- allIndices[-i]
		priceModel = data[indiceDataModel, ncol(data)]
		dataModel = data[indiceDataModel, 1:ncol(data)-1]
		priceTest = data[-indiceDataModel, ncol(data)]
		dataTest = data[-indiceDataModel, 1:ncol(data)-1]
		model <- modelFunction(priceModel, dataModel)
		#prediction = predict.lm(model, newdata=dataTest, se.fit = TRUE)
		predictionModel = predict.lm(model, newdata=dataModel)
		predictionTest = predict.lm(model, newdata=dataTest)
		#print("============")
		#print(priceTest)
		#print(prediction)
		#print("----")
		ecartMoyenModel <- sqrt(sum((predictionTest - priceTest)**2))/nombreDeLigneTest
		ecartMoyenTest <- sqrt((predictionModel - priceModel)**2)
		#print(paste("predict.lm(model):", predict.lm(model)))
		#print(paste("priceModel:", priceModel))
		#print(paste("DEBUG:", ecartMoyenTest))
		ecartsMoyenModel <- c(ecartsMoyenModel, ecartMoyenModel)
		ecartsMoyenTest <- c(ecartsMoyenTest, ecartMoyenTest)
	}
	print(paste("Moyenne des ecarts du model : ", mean(ecartsMoyenModel)))
	print(paste("Moyenne des ecarts de l'echantillon test : ", mean(ecartsMoyenTest)))
}
print("Validation croisée 2 : Model avec indicatrices")
#validationCroisee2(dataDiscretise, modelFunctionFull)

#Regresion sur les donnees quantitatives
print("Validation croisée 2 : Model sans indicatrices")
#validationCroisee2(dataQuantitative, modelFunctionFull)

#Regresion en utilisant que les indicatrices
print("Validation croisée 2 : Model avec seulement indicatrices")
#validationCroisee2(dataIndicatrice, modelFunctionFull)



trouverTransformation <- function(functions, price, variableExplicative){
	print("---")
	resultat <- list()
	squaredCorLineaire <- cor(price, variableExplicative, method = "pearson")**2
	squaredCorSpearman <- cor(price, variableExplicative, method = "spearman")**2
	resultat$squaredCorLineaire <- squaredCorLineaire
	resultat$squaredCorSpearman <- squaredCorSpearman
	resultat$newSquaredCorLineaire <- NA
	resultat$fResultat <- NA
	resultat$found <- FALSE

	#print(paste("triche : ", cor(price, log(variableExplicative), method = "pearson")**2))
	#print(paste("triche : ", cor(price, log(variableExplicative)**2, method = "pearson")**2))
	#print(paste("triche : ", cor(price, log(variableExplicative)**0.5, method = "pearson")**2))
	#print(paste("triche : ", cor(price, log(variableExplicative)**3, method = "pearson")**2))
	bestSquaredCorLineaire <- squaredCorLineaire
	if(squaredCorSpearman > squaredCorLineaire){
		for(i in 1:length(functions)){
			f <- functions[[i]]
			variableTransforme <- f(variableExplicative)
			if(NaN %in% variableTransforme){
				newSquaredCorLineaire = NaN
			}else{
				newSquaredCorLineaire <- cor(price, variableTransforme, method = "pearson")**2
			}
			#print(f)
			#print(newSquaredCorLineaire)
			if(!is.nan(newSquaredCorLineaire) && !is.na(newSquaredCorLineaire)){
				if(newSquaredCorLineaire > bestSquaredCorLineaire){
					bestSquaredCorLineaire <- newSquaredCorLineaire
					resultat$newSquaredCorLineaire <- newSquaredCorLineaire
					resultat$fResultat <- f
					resultat$found <- TRUE
				}
			}
		}
	}
	return(resultat)
}
source("functions.R")

transformation <- trouverTransformation(functions, dataDiscretise$price, dataDiscretise$city_mpg)
print(transformation)
transformation <- trouverTransformation(functions, dataDiscretise$price, dataDiscretise$highway_mpg)
print(transformation)


transformations <- NULL
dataWithQuantTransforme <- dataDiscretise
for(i in indiceVariableQuantitative[-length(indiceVariableQuantitative)]){ #On prend pas le dernier qui correspond a price
	transformation <- trouverTransformation(functions, dataDiscretise$price, dataWithQuantTransforme[,i])
	if(transformation$found == TRUE){
		dataWithQuantTransforme[,i] <- transformation$fResultat(dataWithQuantTransforme[,i])
		transformations <- cbind(transformations, transformation)
	}
}

#print(transformations)
#Regression lineaire multiple avec les varibales transformees
regressionFullVarTransforme <- lm(dataWithQuantTransforme$price ~ ., data = dataWithQuantTransforme[,1:ncol(dataWithQuantTransforme)-1])
print("Regression full var transforme")
print(summary(regressionFullVarTransforme))

#Regresion en utilisant toutes les variables, dont celles transformees
print("Validation croisée 2 : Model avec seulement indicatrices")
#validationCroisee2(dataWithQuantTransforme, modelFunctionFull)

#Methode step pour selectionner les variables
#stepFullVarTransforme <- step(regressionFullVarTransforme)
#print(summary(stepFullVarTransforme))

#recherche des valeurs exceptionnelles ###TODO je saute cette partie
library(gplots)
#plot.lm2(regressionFullVarTransforme, which = 4, main = "residus de f(ant,mf,hf)", caption = NULL, cex.axis=0.7, sub.caption = NULL, las = 1, ann = FALSE)
# On repere trois valeur exceptionnelles : 3, 16, 72
#title(main="distance de cook", xlab="numero des residus",
#ylab="distance de cook en je ne sait quelle unite")

exceptValue = c(3, 16, 72, 62, 152, 199)
exceptValue = c(3, 16, 72, 63)
exceptValue = c(3, 16)
exceptValue = c(3, 16, 72)
exceptValue = c(16, 72)
# en enlevant les valeurs exceptionnelles superieur a 0.3, on passe d'un R carre de 0.9643 a 0.9778
#exceptValue = c(3)
dataWithQuantTransformeWithoutOutliers <- dataWithQuantTransforme[-exceptValue,]
regressionFullVarTransformeWithoutOutliers <- lm(dataWithQuantTransformeWithoutOutliers$price ~ ., data = dataWithQuantTransformeWithoutOutliers[,1:ncol(dataWithQuantTransformeWithoutOutliers)-1])
print("Regression full var transforme sans les outliers")
print(summary(regressionFullVarTransformeWithoutOutliers))
#Regresion en utilisant toutes les variables, dont celles transformees
print("Validation croisée 2 : Model full var transforme sans les outliers")
#validationCroisee2(dataWithQuantTransformeWithoutOutliers, modelFunctionFull)
#plot.lm2(regressionFullVarTransformeWithoutOutliers, which = 4, main = "residus de f(ant,mf,hf)", caption = NULL, cex.axis=0.7, sub.caption = NULL, las = 1, ann = FALSE)
#title(main="distance de cook apres avoir enlever les valeurs exceptionnelles", xlab="numero des residus",
#ylab="distance de cook en je ne sait quelle unite")

#On retente un modele avec step

#stepLmFullVarTransformeWithoutOutliers <- step(regressionFullVarTransformeWithoutOutliers)
#print(summary(stepLmFullVarTransformeWithoutOutliers))

# ACM
print("====================ACM======================")
library(FactoMineR)
mca15DataQuantitative <- MCA(dataQualitativeInitial, ncp = 15)
print(mca15DataQuantitative$eig) #On peut voir les valeurs propres et le pourcentage de variance explique. On peut garde les 15 premiere variable et expliquer environ 53% de l'inertie. Chaque variable explique un pourcentage supereur a 1/49.
#On peut recueprer les donnes avec mcaDataQuantitative$$ind$coord, et rajouter $cos2 ou $contrib pour obtenir les cos carre ou contribution
dataDiscretiseMCA15 <- cbind(mca15DataQuantitative$ind$coord, dataWithoutUnknownPrice[, indiceVariableNumeric])

regressionFullVarWithMCA15 <- lm(dataDiscretiseMCA15$price ~ ., data = dataDiscretiseMCA15[,1:ncol(dataDiscretiseMCA15)-1])
print("regression full variables with MCA")
print(summary(regressionFullVarWithMCA15)) ###TODO je m'arrete la suite a cette variable qui n'a pas ete trouve sans le 15
plot.lm2(regressionFullVarWithMCA15, which = 4, caption = NULL, cex.axis=0.7, sub.caption = NULL, las = 1, ann = FALSE)
title(main="distance de cook apres avec les donnes obtenues avec acm", xlab="numero des residus", ylab="distance de cook en je ne sait quelle unite")
# On trouve un R carre plus petit mais il faut faire attention : i ly a beaucoup moins de variables. La validations croise devrait etre meilleur : a tester.
print("Validation croisée 2 : Regression full variables with MCA")
#validationCroisee2(dataDiscretiseMCA15, modelFunctionFull)

transformationsWithMCA15 <- NULL
dataDiscretiseMCA15Transforme <- dataDiscretiseMCA15
for(i in 1:(ncol(dataDiscretiseMCA15)-1)){ #On prend pas le dernier qui correspond a price
	transformation <- trouverTransformation(functions, dataDiscretise$price, dataDiscretiseMCA15Transforme[,i])
	if(transformation$found == TRUE){
		dataDiscretiseMCA15Transforme[,i] <- transformation$fResultat(dataDiscretiseMCA15Transforme[,i])
		transformationsWithMCA15 <- cbind(transformationsWithMCA15, transformation)
	}
}

regressionFullVarWithMCA15Transforme <- lm(dataDiscretiseMCA15Transforme$price ~ ., data = dataDiscretiseMCA15Transforme[,1:ncol(dataDiscretiseMCA15Transforme)-1])
print("regression full variables with MCA et variables transformees")
print(summary(regressionFullVarWithMCA15Transforme))
plot.lm2(regressionFullVarWithMCA15Transforme, which = 4, caption = NULL, cex.axis=0.7, sub.caption = NULL, las = 1, ann = FALSE)
title(main="distance de cook apres avec les donnes obtenues avec acm", xlab="numero des residus", ylab="distance de cook en je ne sait quelle unite")
#Cette fois ca marche moins bien...Faudrait pas transforme les acm peut etre

#stepRegressionFullVarWithMCA15 <- step(regressionFullVarWithMCA15)
#print("step regression full variables with MCA")
#print(summary(stepRegressionFullVarWithMCA15))
#plot.lm2(stepRegressionFullVarWithMCA15, which = 4, caption = NULL, cex.axis=0.7, sub.caption = NULL, las = 1, ann = FALSE)
#title(main="distance de cook apres avec les donnes obtenues avec acm et une reg step", xlab="numero des residus", ylab="distance de cook en je ne sait quelle unite")

transformationsWithMCA15_v2 <- NULL
dataDiscretiseMCA15Transforme_v2 <- dataDiscretiseMCA15
for(i in 16:(ncol(dataDiscretiseMCA15)-1)){ #On prend pas le dernier qui correspond a price
	transformation <- trouverTransformation(functions, dataDiscretise$price, dataDiscretiseMCA15Transforme_v2[,i])
	if(transformation$found == TRUE){
		dataDiscretiseMCA15Transforme_v2[,i] <- transformation$fResultat(dataDiscretiseMCA15Transforme_v2[,i])
		transformationsWithMCA15_v2 <- cbind(transformationsWithMCA15_v2, transformation)
	}
}

regressionFullVarWithMCA15Transforme_v2 <- lm(dataDiscretiseMCA15Transforme_v2$price ~ ., data = dataDiscretiseMCA15Transforme_v2[,1:ncol(dataDiscretiseMCA15Transforme_v2)-1]) #cette fois on transforme tous sauf les variablese ACM
print("regression full variables with MCA et variables non mca transformees")
print(summary(regressionFullVarWithMCA15Transforme_v2))
plot.lm2(regressionFullVarWithMCA15Transforme_v2, which = 4, caption = NULL, cex.axis=0.7, sub.caption = NULL, las = 1, ann = FALSE)
title(main="distance de cook apres avec les donnes obtenues avec acm et variable non acm transforme", xlab="numero des residus", ylab="distance de cook en je ne sait quelle unite")
#ca marche beaucoup mieux ! mais y a un valeur exceptionnel : 50 qui a une distance de cook de 3
print("Validation croisée 2 : Regression full variables with MCA")
#validationCroisee2(dataDiscretiseMCA15Transforme_v2, modelFunctionFull)

exceptValue = 50 #ca marche pas beaucoup mieux
exceptValue = c(16, 72) #ca marche un peu mieux
dataDiscretiseMCA15Transforme_v2WithoutOutliers <- dataDiscretiseMCA15Transforme_v2[-exceptValue,]
regressionFullVarWithMCA15Transforme_v2WithoutOutliers <- lm(dataDiscretiseMCA15Transforme_v2WithoutOutliers$price ~ ., data = dataDiscretiseMCA15Transforme_v2WithoutOutliers[,1:ncol(dataDiscretiseMCA15Transforme_v2WithoutOutliers)-1]) #cette fois on transforme tous sauf les variablese ACM
print("regression full variables with MCA et variables non mca transformees v2WithoutOutliers")
print(summary(regressionFullVarWithMCA15Transforme_v2WithoutOutliers))
print("Validation croisée 2 : Regression full variables with MCA v2WithoutOutliers")
#validationCroisee2(dataDiscretiseMCA15Transforme_v2WithoutOutliers, modelFunctionFull)
# Pas trop de changement


stepRegressionFullVarWithMCA15Transforme_v2 <- step(regressionFullVarWithMCA15Transforme_v2)
print("step regression with MCA et variables mca transformees")
print(summary(stepRegressionFullVarWithMCA15Transforme_v2))
plot.lm2(stepRegressionFullVarWithMCA15Transforme_v2, which = 4, caption = NULL, cex.axis=0.7, sub.caption = NULL, las = 1, ann = FALSE)
title(main="distance de cook apres avec les donnes obtenues avec acm et variable non acm transforme en step", xlab="numero des residus", ylab="distance de cook en je ne sait quelle unite")
#plot.lm2(stepRegressionFullVarWithMCA15Transforme_v2, caption = NULL, cex.axis=0.7, sub.caption = NULL, las = 1, ann = FALSE)


exceptValues <- 47
dataDiscretiseMCA15Transforme_v2WithoutOutliers <- dataDiscretiseMCA15Transforme_v2[-exceptValues,]

regressionFullVarWithMCA15Transforme_v2WithoutOutliers <- lm(dataDiscretiseMCA15Transforme_v2WithoutOutliers$price ~ ., data = dataDiscretiseMCA15Transforme_v2WithoutOutliers[,1:ncol(dataDiscretiseMCA15Transforme_v2WithoutOutliers)-1])
print("regression full variables with MCA et variables non mca transformees without outliers")
print(summary(regressionFullVarWithMCA15Transforme_v2WithoutOutliers))
plot.lm2(regressionFullVarWithMCA15Transforme_v2WithoutOutliers, which = 4, caption = NULL, cex.axis=0.7, sub.caption = NULL, las = 1, ann = FALSE)
title(main="distance de cook apres avec les donnes obtenues avec acm et variable non acm transforme without outliers", xlab="numero des residus", ylab="distance de cook en je ne sait quelle unite")
#Ca  change pas grand chose apres avoir enleve la valeur exceptionnelle

#Toutes les variables
dataDiscretiseFull <- cbind(mca15DataQuantitative$ind$coord, dataDiscretise)
#exceptValue = c(16, 72)
#dataDiscretiseFull <- dataDiscretiseFull[-exceptValue,] #TODO faudrait que je cree une nouvelle variable
regressionDiscretiseFull <- lm(dataDiscretiseMCA15Transforme_v2$price ~ ., data = dataDiscretiseMCA15Transforme_v2[,1:ncol(dataDiscretiseMCA15Transforme_v2)-1]) #cette fois on transforme tous sauf les variablese ACM
print("regression toutes variables 2 types discretises")
print(summary(regressionDiscretiseFull))
plot.lm2(regressionDiscretiseFull, which = 4, caption = NULL, cex.axis=0.7, sub.caption = NULL, las = 1, ann = FALSE)
title(main="distance de cook apres avec les donnes obtenues avec acm et variable non acm transforme", xlab="numero des residus", ylab="distance de cook en je ne sait quelle unite")
print("Validation croisée 2 : Regression toutes variables 2 types discretises")
#validationCroisee2(dataDiscretiseFull, modelFunctionFull)

if(TRUE){
print("STEP : Regression toutes variables 2 types discretises")
stepRegressionDiscretiseFull <- step(regressionDiscretiseFull)
print(summary(stepRegressionDiscretiseFull))
}
plot.lm2(stepRegressionDiscretiseFull, which = 4, caption = NULL, cex.axis=0.7, sub.caption = NULL, las = 1, ann = FALSE)
title(main="distance de cook apres avec les donnes obtenues avec acm et variable non acm transforme", xlab="numero des residus", ylab="distance de cook en je ne sait quelle unite")


modelStep1 <-function(price, data){
	return(lm(price ~ data$`Dim 2` + data$`Dim 3` + data$`Dim 4` + data$`Dim 5` + data$`Dim 6` + data$`Dim 7` + data$`Dim 8` + data$`Dim 9` + data$`Dim 10` + data$`Dim 11` + data$`Dim 12` + data$`Dim 13` + data$`Dim 14` + data$`Dim 15` + data$symboling + data$normalized_losses + data$wheel_base + data$height + data$curb_weight + data$city_mpg))
}
print("STEP Validation croisée 2 : Regression toutes variables 2 types discretises")
validationCroisee2(dataDiscretiseFull, modelStep1)


#TODO
#Je pourrai essayer de faire seulement les transformations sur les variables non acm, et comparer les methode avec validations croisee
#Verifier que les outliers c'etait bien les valeurs affiches sur le graphique
# Regarder les autres graphiques avec plot.lm2
# Trouver comment selectionner moins de vairables avec step
# Creer une fonction pour mes ma regression habituelle ?
# creer plus de fichiers pour chaque traitement, afin d'augmenter la lisibilite. Par exemple un pour les outliers, un pour les correlations, un pour acm, un pour regression
# Reflechir a un plan de regression
# Creer un fichier readme pour dire dans quel ordre executer les fichiers
# plus de regression
# rapport

#TOASK:
# validation croisee : calcul de l'ecart moyen pour un echantillon test de 30 % ?
# Selection de variables : on peut utiliser la boite noire step, ou il faut f aire un truc dont on est sur
# RApport : on doit expliquer toute les theorie des methodes ?
